<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006-2016 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: 流年 <liu21st@gmail.com>
// +----------------------------------------------------------------------

// 应用公共文件
if (!function_exists('getClientIp')) {
    /**
     * 获取客户端IP地址
     * @return mixed
     */
    function getClientIp() {
        if (getenv("HTTP_CLIENT_IP") && strcasecmp(getenv("HTTP_CLIENT_IP"), "unknown")){
			$ip = getenv("HTTP_CLIENT_IP");
		}else if (getenv("HTTP_X_FORWARDED_FOR") && strcasecmp(getenv("HTTP_X_FORWARDED_FOR"), "unknown")){
			$ip = getenv("HTTP_X_FORWARDED_FOR");
		}else if (getenv("REMOTE_ADDR") && strcasecmp(getenv("REMOTE_ADDR"), "unknown")){
			$ip = getenv("REMOTE_ADDR");
		}else if (isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], "unknown")){
           $ip = $_SERVER['REMOTE_ADDR'];
		}else{
           $ip = "unknown";
		}
		return($ip);
    }
}
if (!function_exists('HttpExecute')) {
	/**
	 * 获取URL内容
	 *
	 * @param $url string 请求URL
	 * @param $method int 请求方法，可选值HTTP_METHOD_GET,HTTP_METHOD_POST
	 * @param $data array|null 如果为POST提交，那么data为POST数据
	 * @param $header array|null 请求头
	 * @param $timeout int 超时时间，默认30秒
	 * @param $charset string 请求URL的内容编码，如果不是utf-8，那么会被转换为utf-8编码
	 * @return null|string 返回内容，如果返回NULL，表示请求失败
	 */
	function HttpExecute($url, $method = 'HTTP_METHOD_GET', $data = NULL, $header = NULL, $timeout = 30, $charset = 'utf-8')
	{
		if(empty($url)) return NULL;
		$methods = array('HTTP_METHOD_GET', 'HTTP_METHOD_POST');
		if( ! in_array($method, $methods)) return NULL;
		if($method=='HTTP_METHOD_POST' && ! is_array($data)) return NULL;
		$timeout = @intval($timeout);
		if($timeout<=0) $timeout = 30;
		$curl = curl_init();
		curl_setopt($curl, CURLOPT_URL, $url);
		curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
		curl_setopt($curl, CURLOPT_HEADER, FALSE);
		curl_setopt($curl, CURLOPT_TIMEOUT, $timeout);
		if($method=='HTTP_METHOD_POST'){
			curl_setopt($curl, CURLOPT_POST, TRUE);
			curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($data));
		}else if($method=='HTTP_METHOD_GET'){
			curl_setopt($curl, CURLOPT_HTTPGET, TRUE);
		}
		if( is_array($header) && count($header)>0){
			curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
		}
		$ret = @curl_exec($curl);
		curl_close($curl);

		if($ret===FALSE){
			return NULL;
		}
		if(strtolower($charset)!='utf-8'){
			$ret = @iconv($charset, 'utf-8', $ret);
		}
		return $ret;
	}
}
if (!function_exists('HttpGet')) {
	/**
	 * 通过GET方式请求URL内容
	 *
	 * @param $url string URL地址
	 * @param $header array|null 请求头
	 * @param $timeout int 超时时间
	 * @param $charset string URL内容编码
	 * @return null|string 返回内容
	 */
	function HttpGet($url, $header = NULL, $timeout = 30, $charset = 'utf-8')
	{
		if(empty($url)) return NULL;
		return HttpExecute($url, 'HTTP_METHOD_GET', NULL, $header, $timeout, $charset);
	}
}
if (!function_exists('HttpPost')) {
	/**
	 * 通过POST方式请求URL数据
	 *
	 * @param $url string 请求URL
	 * @param $data array 请求数据
	 * @param $header array|null 请求头
	 * @param $timeout int 超时时间
	 * @param $charset string 请求内容编码
	 * @return null|string 返回结果
	 */
	function HttpPost($url, $data, $header = NULL, $timeout = 30, $charset = 'utf-8')
	{
		if(empty($url) || ! is_array($data)) return NULL;
		return HttpExecute($url, 'HTTP_METHOD_POST', $data, $header, $timeout, $charset);
	}
}
if (!function_exists('HttpGetJson')) {
	/**
	 * 通过GET方式请求URL内容，并解析返回的JSON数据为数组
	 *
	 * @param $url string 请求URL
	 * @param $header array|null 请求头
	 * @param $timeout int 超时时间
	 * @param $charset string 请求内容编码
	 * @return null|array 返回内容，返回NULL表示请求失败，返回数组表示成功返回
	 */
	function HttpGetJson($url, $header = NULL, $timeout = 30, $charset = 'utf-8')
	{
		if(empty($url)) return NULL;
		$ret = HttpGet($url, $header, $timeout, $charset);
		$ret = @json_decode($ret, TRUE);
		if( ! is_array($ret)) return NULL;
		return $ret;
	}
}
if (!function_exists('HttpPostJson')) {
	/**
	 * 通过POST方式请求URL内容，并解析返回的JSON数据为数组
	 *
	 * @param $url string 请求URL
	 * @param $data array 请求内容
	 * @param $header array|null 请求头
	 * @param $timeout int 请求超时时间
	 * @param $charset string 请求内容编码
	 * @return null|array 返回内容，返回NULL表示请求失败，返回数组表示成功返回
	 */
	function HttpPostJson($url, $data, $header = NULL, $timeout = 30, $charset = 'utf-8')
	{
		if(empty($url) || ! is_array($data)) return NULL;
		$ret = HttpPost($url, $data, $header, $timeout, $charset);
		$ret = @json_decode($ret, TRUE);
		if( ! is_array($ret)) return NULL;
		return $ret;
	}
}
if (!function_exists('FiltrsHttpJson')) {
	/**
	 * 通过POST方式请求URL内容，并解析返回的JSON数据为数组
	 *
	 * @param $url string 请求URL
	 * @param $data array 请求内容
	 * @param $header array|null 请求头
	 * @param $timeout int 请求超时时间
	 * @param $charset string 请求内容编码
	 * @return null|array 返回内容，返回NULL表示请求失败，返回数组表示成功返回
	 */
	function FiltrsHttpJson($Url,$Act,$AppVersion='1.0',$params=[],$Version='1.0')
	{
		$token  = 'comboqiiwwwvetapp';
		$commit_url = $Url;
		$params['AppVersion'] = $AppVersion;
		$params['Model']  = '';
		$params['SystemName']   = 'H5';
		$params['SystemVersion']   = '';
		$params['UDID']   = '';
		$params['Act'] = $Act;
		$params['Version']  = $Version;
		$params['Format']   = 'json';
		//签名
		$params['Sign'] = Sign( $params, $token );
		return HttpPostJson($commit_url,$params);
	}
	
	if (!function_exists('Sign')) {
		/**
		 * 通过POST方式请求URL内容，并解析返回的JSON数据为数组
		 *
		 * @param $url string 请求URL
		 * @param $data array 请求内容
		 * @param $header array|null 请求头
		 * @param $timeout int 请求超时时间
		 * @param $charset string 请求内容编码
		 * @return null|array 返回内容，返回NULL表示请求失败，返回数组表示成功返回
		 */
		function Sign($params,$token)
		{
			if(array_key_exists('Sign',$params)){
				unset($params['Sign']);
			}
			ksort($params);
			$str = '';
			foreach($params as $key=>$v)
			{
				$str.=$v;
			}
			return md5($str.$token);
		}
	}
	if (!function_exists('authcode')) {
		/**
		 * Discuz 加密/解密
		 *
		 * @param [type]  $string    [description]
		 * @param string  $operation [description]
		 * @param string  $key       [description]
		 * @param integer $expiry    [description]
		 * @return [type]            [description]
		 */
		function authcode( $string, $operation = 'DECODE', $key = '', $expiry = 0 ) {
			$ckey_length = 4;
			$key = md5( $key != '' ? $key : 'AUTH_CODE' );
			$keya = md5( substr( $key, 0, 16 ) );
			$keyb = md5( substr( $key, 16, 16 ) );
			$keyc = $ckey_length ? ( $operation == 'DECODE' ? substr( $string, 0, $ckey_length ): substr( md5( microtime() ), -$ckey_length ) ) : '';
			$cryptkey = $keya.md5( $keya.$keyc );
			$key_length = strlen( $cryptkey );
			$string = $operation == 'DECODE' ? base64_decode( substr( $string, $ckey_length ) ) : sprintf( '%010d', $expiry ? $expiry + time() : 0 ).substr( md5( $string.$keyb ), 0, 16 ).$string;
			$string_length = strlen( $string );
			$result = '';
			$box = range( 0, 255 );
			$rndkey = array();
			for ( $i = 0; $i <= 255; $i++ ) {
				$rndkey[$i] = ord( $cryptkey[$i % $key_length] );
			}
			for ( $j = $i = 0; $i < 256; $i++ ) {
				$j = ( $j + $box[$i] + $rndkey[$i] ) % 256;
				$tmp = $box[$i];
				$box[$i] = $box[$j];
				$box[$j] = $tmp;
			}
			for ( $a = $j = $i = 0; $i < $string_length; $i++ ) {
				$a = ( $a + 1 ) % 256;
				$j = ( $j + $box[$a] ) % 256;
				$tmp = $box[$a];
				$box[$a] = $box[$j];
				$box[$j] = $tmp;
				$result .= chr( ord( $string[$i] ) ^ ( $box[( $box[$a] + $box[$j] ) % 256] ) );
			}
			if ( $operation == 'DECODE' ) {
				if ( ( substr( $result, 0, 10 ) == 0 || substr( $result, 0, 10 ) - time() > 0 ) && substr( $result, 10, 16 ) == substr( md5( substr( $result, 26 ).$keyb ), 0, 16 ) ) {
					return substr( $result, 26 );
				} else {
					return '';
				}
			} else {
				return $keyc.str_replace( '=', '', base64_encode( $result ) );
			}
		}
	}
}